package com.reminis.exceldemo.util;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 日志工具类
 * 提供统一的日志记录方法，用于记录业务操作的详细信息
 */
public class LogUtils {

    private static final Logger log = LogManager.getLogger(LogUtils.class);

    /**
     * 记录文件上传的详细信息
     * @param file 上传的文件
     * @param operation 操作描述
     */
    public static void logFileUpload(MultipartFile file, String operation) {
        if (file == null) {
            log.warn("文件上传日志记录 - 文件为null, 操作: {}", operation);
            return;
        }

        log.info("=== 文件上传详细信息 ===");
        log.info("操作类型: {}", operation);
        log.info("文件名: {}", file.getOriginalFilename());
        log.info("文件大小: {} bytes ({} KB)", file.getSize(), file.getSize() / 1024);
        log.info("文件类型: {}", file.getContentType());
        log.info("是否为空: {}", file.isEmpty());
        log.info("========================");
    }

    /**
     * 记录数据库操作的详细信息
     * @param operation 操作类型（如：INSERT, UPDATE, DELETE, SELECT）
     * @param tableName 表名
     * @param recordCount 影响的记录数
     * @param details 操作详情
     */
    public static void logDatabaseOperation(String operation, String tableName, int recordCount, String details) {
        log.info("=== 数据库操作详细信息 ===");
        log.info("操作类型: {}", operation);
        log.info("表名: {}", tableName);
        log.info("影响记录数: {}", recordCount);
        if (details != null && !details.isEmpty()) {
            log.info("操作详情: {}", details);
        }
        log.info("==========================");
    }

    /**
     * 记录批量操作的进度信息
     * @param operation 操作描述
     * @param current 当前处理的数量
     * @param total 总数量
     * @param item 当前处理的项目描述
     */
    public static void logBatchProgress(String operation, int current, int total, String item) {
        if (current % 100 == 0 || current == total) { // 每100条记录或最后一条记录时输出日志
            double percentage = (double) current / total * 100;
            log.info("{} 进度: {}/{} ({:.1f}%) - 当前项目: {}", 
                    operation, current, total, percentage, item);
        }
    }

    /**
     * 记录业务操作的开始和结束时间
     * @param operation 操作描述
     * @param startTime 开始时间（毫秒）
     * @param endTime 结束时间（毫秒）
     * @param success 操作是否成功
     * @param details 操作详情
     */
    public static void logBusinessOperation(String operation, long startTime, long endTime, 
                                          boolean success, String details) {
        long duration = endTime - startTime;
        
        log.info("=== 业务操作执行结果 ===");
        log.info("操作描述: {}", operation);
        log.info("执行时间: {} ms ({} 秒)", duration, duration / 1000.0);
        log.info("执行结果: {}", success ? "成功" : "失败");
        if (details != null && !details.isEmpty()) {
            log.info("操作详情: {}", details);
        }
        log.info("========================");
    }

    /**
     * 记录Excel处理的详细信息
     * @param operation 操作类型（导入/导出）
     * @param fileName 文件名
     * @param recordCount 处理的记录数
     * @param processingTime 处理时间（毫秒）
     * @param success 是否成功
     */
    public static void logExcelOperation(String operation, String fileName, int recordCount, 
                                       long processingTime, boolean success) {
        log.info("=== Excel操作详细信息 ===");
        log.info("操作类型: {}", operation);
        log.info("文件名: {}", fileName);
        log.info("处理记录数: {}", recordCount);
        log.info("处理时间: {} ms ({} 秒)", processingTime, processingTime / 1000.0);
        log.info("操作结果: {}", success ? "成功" : "失败");
        if (recordCount > 0) {
            log.info("平均处理速度: {:.2f} 记录/秒", (double) recordCount / (processingTime / 1000.0));
        }
        log.info("=========================");
    }

    /**
     * 记录异常信息的详细日志
     * @param operation 发生异常的操作
     * @param exception 异常对象
     * @param context 异常发生的上下文信息
     */
    public static void logException(String operation, Exception exception, String context) {
        log.error("=== 异常详细信息 ===");
        log.error("发生异常的操作: {}", operation);
        log.error("异常类型: {}", exception.getClass().getSimpleName());
        log.error("异常信息: {}", exception.getMessage());
        if (context != null && !context.isEmpty()) {
            log.error("异常上下文: {}", context);
        }
        log.error("异常堆栈:", exception);
        log.error("==================");
    }

    /**
     * 记录数据验证的结果
     * @param operation 验证操作描述
     * @param totalCount 总验证数量
     * @param validCount 验证通过数量
     * @param invalidCount 验证失败数量
     * @param errors 错误信息列表
     */
    public static void logValidationResult(String operation, int totalCount, int validCount, 
                                         int invalidCount, List<String> errors) {
        log.info("=== 数据验证结果 ===");
        log.info("验证操作: {}", operation);
        log.info("总验证数量: {}", totalCount);
        log.info("验证通过: {}", validCount);
        log.info("验证失败: {}", invalidCount);
        log.info("成功率: {:.2f}%", totalCount > 0 ? (double) validCount / totalCount * 100 : 0);
        
        if (errors != null && !errors.isEmpty()) {
            log.warn("验证错误详情:");
            for (int i = 0; i < Math.min(errors.size(), 10); i++) { // 最多显示10个错误
                log.warn("  错误 {}: {}", i + 1, errors.get(i));
            }
            if (errors.size() > 10) {
                log.warn("  ... 还有 {} 个错误未显示", errors.size() - 10);
            }
        }
        log.info("==================");
    }
}